
import 'dart:async';

/// 礼物队列 - 适用于Banner横幅礼物，当展示完才清空数据
class XinDongTimerQueue {
  // 并发队列最大数
  final int maxCount;

  // 有队列开始时回调
  final Function(dynamic) startCallback;

  // 有队列结束时回调
  final Function() endCallback;

  // 排队【等待队列】
  List awaitList = [];

  // 进行中【进行队列】
  List ongoingList = [];

  /// 构造函数
  XinDongTimerQueue({this.maxCount = 1, required this.startCallback, required this.endCallback});

  /// 清除
  void clear() {
    awaitList.clear();
    ongoingList.clear();
  }

  /// 添加方法
  /// 队列进行时间（毫秒，默认3000）
  void addQueue(var object, {int milliseconds = 3000}) {
    if (object == null) {
      return;
    }
    // 对象先排队到【等待队列】
    awaitList.add(object);
    // 不需等待，取出数据进入到【进行队列】先进先出

    // 【进行队列】数已达上限 --> 等待
    if (ongoingList.length >= maxCount) {
      return;
    }

    // 可以到【进行队列】
    createTimer(milliseconds);
  }

  /// 定时器
  void createTimer(int milliseconds) {
    var first = awaitList.first;
    ongoingList.insert(0, first);
    awaitList.remove(first);
    startCallback(first);
    // 给定时间后从队列中将数据移除
    Future.delayed(Duration(milliseconds: milliseconds)).whenComplete(() {
      if (ongoingList.isNotEmpty) ongoingList.removeLast();
      if (awaitList.isNotEmpty) {
        // 递归
        createTimer(milliseconds);
      } else {
        if (ongoingList.isEmpty) {
          endCallback();
        }
      }
    });
  }
}
